package com.aizuda.boot.modules.common.constant.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 证件类型枚举
 */
@Getter
@AllArgsConstructor
public enum CertificateTypeEnum {

    // 企业相关证件
    UNIFIED_SOCIAL_CREDIT_CODE(1, "统一社会信用代码", "企业和非营利组织使用的统一社会信用代码", Arrays.asList(CounterpartyNatureEnum.ENTERPRISE, CounterpartyNatureEnum.NON_PROFIT_ORGANIZATION)),
    REGISTRATION_NUMBER(10, "注册号", "企业工商注册号", Arrays.asList(CounterpartyNatureEnum.ENTERPRISE)),
    TAX_NUMBER(11, "税号", "税务登记号或纳税人识别号", Arrays.asList(CounterpartyNatureEnum.ENTERPRISE, CounterpartyNatureEnum.NATURAL_PERSON)),
    
    // 自然人相关证件
    MAINLAND_CHINA_ID_CARD(2, "中国大陆居民身份证", "中华人民共和国居民身份证", Arrays.asList(CounterpartyNatureEnum.NATURAL_PERSON)),
    PASSPORT(3, "护照", "各国签发的护照", Arrays.asList(CounterpartyNatureEnum.NATURAL_PERSON)),
    HK_MACAO_PASS(4, "港澳居民来往大陆通行证", "港澳居民来往内地通行证", Arrays.asList(CounterpartyNatureEnum.NATURAL_PERSON)),
    TAIWAN_PASS(5, "台湾居民来往大陆通行证", "台湾居民来往大陆通行证", Arrays.asList(CounterpartyNatureEnum.NATURAL_PERSON)),
    HK_PERMANENT_ID(6, "香港永久性居民身份证", "香港特别行政区永久性居民身份证", Arrays.asList(CounterpartyNatureEnum.NATURAL_PERSON)),
    MACAO_PERMANENT_ID(7, "澳门特别行政区永久性居民身份证", "澳门特别行政区永久性居民身份证", Arrays.asList(CounterpartyNatureEnum.NATURAL_PERSON)),
    TAIWAN_ID_CARD(8, "台湾身份证", "台湾地区身份证", Arrays.asList(CounterpartyNatureEnum.NATURAL_PERSON)),
    FOREIGN_PERMANENT_RESIDENCE(9, "外国人永久居留证", "中华人民共和国外国人永久居留证", Arrays.asList(CounterpartyNatureEnum.NATURAL_PERSON)),
    DRIVERS_LICENSE(12, "驾驶证", "机动车驾驶证", Arrays.asList(CounterpartyNatureEnum.NATURAL_PERSON)),
    ID_CARD(13, "身份证", "通用身份证件", Arrays.asList(CounterpartyNatureEnum.NATURAL_PERSON)),
    HOUSEHOLD_NUMBER(14, "户号", "户籍登记号码", Arrays.asList(CounterpartyNatureEnum.NATURAL_PERSON));

    /**
     * 代码
     */
    private final Integer code;

    /**
     * 名称
     */
    private final String name;

    /**
     * 描述
     */
    private final String desc;

    /**
     * 适用的交易方性质列表
     */
    private final List<CounterpartyNatureEnum> applicableNatures;

    /**
     * 根据交易方性质获取可用的证件类型列表
     * 
     * @param natureCode 交易方性质代码
     * @return 证件类型列表
     */
    public static List<CertificateTypeEnum> getByNatureCode(Integer natureCode) {
        CounterpartyNatureEnum nature = CounterpartyNatureEnum.getByCode(natureCode);
        if (nature == null) {
            return new ArrayList<>();
        }
        
        List<CertificateTypeEnum> result = new ArrayList<>();
        for (CertificateTypeEnum certType : values()) {
            if (certType.getApplicableNatures().contains(nature)) {
                result.add(certType);
            }
        }
        return result;
    }

    /**
     * 根据code获取枚举
     * 
     * @param code 代码
     * @return 枚举对象
     */
    public static CertificateTypeEnum getByCode(Integer code) {
        if (code == null) {
            return null;
        }
        for (CertificateTypeEnum type : values()) {
            if (type.getCode().equals(code)) {
                return type;
            }
        }
        return null;
    }

    /**
     * 根据国家代码和交易方性质获取可用的证件类型列表
     * 
     * @param countryCode 国家代码
     * @param natureCode 交易方性质代码
     * @return 证件类型列表
     */
    public static List<CertificateTypeEnum> getByCountryAndNature(String countryCode, Integer natureCode) {
        List<CertificateTypeEnum> result = new ArrayList<>();
        
        if (countryCode == null || natureCode == null) {
            return result;
        }
        
        if ("CN".equals(countryCode)) {
            // 中国
            if (natureCode == 1 || natureCode == 3) {
                // 企业或非营利组织：返回统一社会信用代码
                result.add(UNIFIED_SOCIAL_CREDIT_CODE);
            } else if (natureCode == 2) {
                // 自然人：返回 code 2-9 的枚举
                result.add(MAINLAND_CHINA_ID_CARD);
                result.add(PASSPORT);
                result.add(HK_MACAO_PASS);
                result.add(TAIWAN_PASS);
                result.add(HK_PERMANENT_ID);
                result.add(MACAO_PERMANENT_ID);
                result.add(TAIWAN_ID_CARD);
                result.add(FOREIGN_PERMANENT_RESIDENCE);
            }
        } else {
            // 非中国
            if (natureCode == 1 || natureCode == 3) {
                // 企业或非营利组织：返回 code 10-11 的枚举
                result.add(REGISTRATION_NUMBER);
                result.add(TAX_NUMBER);
            } else if (natureCode == 2) {
                // 自然人：返回 code 12-14 的枚举
                result.add(DRIVERS_LICENSE);
                result.add(ID_CARD);
                result.add(HOUSEHOLD_NUMBER);
            }
        }
        
        return result;
    }


    public static Integer getCodeByName(String name) {
        for (CertificateTypeEnum value : CertificateTypeEnum.values()) {
            if (value.name.equals(name)) {
                return value.code;
            }
        }
        return null;
    }
} 